package com.atguigu.day02.transform;

import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class Flink05_KeyBy {
    public static void main(String[] args) {
         Configuration conf = new Configuration();
          //配置web页面固定端口
          conf.setInteger("rest.port", 20000);
          //创建流环境
          StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(conf);
          //设置并行度
          env.setParallelism(2);

        DataStreamSource<Integer> stream = env.fromElements(1, 2, 3, 5, 7, 8, 9);

        /**
         * keyBy作用：把流中的数据分到不同的分区中
         *底层实现：
         *    keyBy底层用输入值的hashCode值进行计算，
         *    分区索引计算方式： keyGroupId（0-127） * parallelism（并行度） / maxParallelism（128） 结果值为分区的索引
         *   以parallelism=2 为例：
         *     输入值的hashCode值计算结果为[0-64)，在0分区
         *     输入值的hashCode值计算结果为[64-128)，在1分区
         *
         * 不可以作为key的值：
         *          任何类型的数组
         *          没有覆写hashCode方法的 POJO（只有get set的类）
         */
        stream.keyBy(new KeySelector<Integer, String>() {
            @Override
            public String getKey(Integer value) throws Exception {
                return value % 2 ==0 ?"偶数":"奇数";
            }
        }).print();


        try {
              env.execute();
          } catch (Exception e) {
              e.printStackTrace();
          }
    }
}
